class SessionFiller(with_metaclass(metabase.MetaParams, object)):
    '''
    在声明的会话开始/结束时间内，用于数据源的Bar Filler。

    使用声明的数据源“timeframe”和“compression”构建填充条（用于计算中间缺失的时间）

    参数：

      - fill_price（默认值：None）：

        如果传递了None，则使用前一个bar的收盘价。
        为了得到一个bar，例如花费时间但不在绘图中显示...使用float（'Nan'）

      - fill_vol（默认值：float（'NaN'））：

        用于填充缺失的体积的值

      - fill_oi（默认值：float（'NaN'））：

        用于填充缺失的Open Interest的值

      - skip_first_fill（默认值：True）：

        在看到第一个有效bar时，不要从sessionstart开始填充到该bar
    '''

    def __call__(self, data):
        '''
        参数：
          - data：要过滤/处理的数据源

        返回：
          - False（始终）因为此过滤器不会从流中删除bar

        逻辑（从会话结束控制标志MAXDATE开始）

          - 如果新bar超过会话结束（对于第一个bar永远不会为真）

            填充到会话结束。将sessionend重置为MAXDATE并继续

          - 如果会话结束被标记为MAXDATE

            重新计算会话限制并检查bar是否在其中

            如果是，则填充并记录最后看到的时间

          - 否则...传入的bar在会话中，填充到它
        '''

class SessionFilterSimple(with_metaclass(metabase.MetaParams, object)):
    '''
    可以将此类作为过滤器应用于数据源，并过滤掉落在常规会话时间之外的盘中bar（即：盘前/盘后市场数据）

    这是一个“简单”过滤器，不得管理数据的堆栈（在init和__call__期间传递）

    它不需要“last”方法，因为它没有任何东西要提供

    Bar Management将由SimpleFilterWrapper类完成，该类在DataBase.addfilter_simple调用时添加
    '''
    def __call__(self, data):
        '''
        返回值：
          - False：没有要过滤的内容
          - True：过滤当前bar（因为它不在会话时间内）
        '''

class SessionFilter(with_metaclass(metabase.MetaParams, object)):
    '''
    可以将此类作为过滤器应用于数据源，并过滤掉落在常规会话时间之外的盘中bar（即：盘前/盘后市场数据）

    这是一个“非简单”过滤器，必须管理数据的堆栈（在init和__call__期间传递）

    它不需要“last”方法，因为它没有任何东西要提供
    '''
    def __call__(self, data):
        '''
        返回值：
          - False：数据流未被触及
          - True：数据流被操作（bar在会话时间之外并已删除）
        '''

class CalendarDays(with_metaclass(metabase.MetaParams, object)):
    '''
# 填充器，用于将缺失的日历日期添加到交易日
    参数：
      - fill_price（默认值：None）：

        > 0：要填充的给定值
        0或None：使用最后已知的收盘价
        -1：使用最后一个条的中点（High-Low平均值）

      - fill_vol（默认值：float（'NaN'））：

        用于填充缺失的交易量的值

      - fill_oi（默认值：float（'NaN'））：

        用于填充缺失的未平仓量的值

    '''
    def __call__(self, data):
        '''
          如果数据中的两个交易日之间的间隔大于1天，则将缺失的交易日添加到数据流中。

        参数：
          - data：要过滤/处理的数据源

        返回：
          - False（始终）：此过滤器不会从数据流中删除交易日

        '''

class BarReplayer_Open(object):
    '''
    这个过滤器将一个bar分成两个部分：

      - ``Open``：bar的开盘价将用于提供一个初始价格bar，其中四个组成部分（OHLC）相等

        该初始bar的volume/openinterest字段为0

      - ``OHLC``：原始bar完整地提供了原始的``volume``/``openinterest``

    这个分割模拟了回放而不需要使用*replay*过滤器。
    '''

    def last(self, data):
        '''当数据不再产生bar时调用
        可以被调用多次。它有机会（例如）
        产生额外的bar'''


class DaySplitter_Close(bt.with_metaclass(bt.MetaParams, object)):
    '''
        将每日的K线分成两部分，模拟2个tick，用于回放数据：
      - 第一个tick：``OHLX``

        ``Close`` 价格将被替换为 ``Open``、``High`` 和 ``Low`` 的*平均值*

        该tick使用的是会话开放时间

      和

      - 第二个tick：``CCCC``

        ``Close`` 价格将用于价格的四个组成部分

        该tick使用的是会话关闭时间

    成交量将使用以下参数分配给2个tick：

      - ``closevol``（默认值：``0.5``）该值表示应分配给*关闭* tick的百分比，绝对值从0.0到1.0。其余部分将分配给 ``OHLX`` tick。

    **此过滤器应与** ``cerebro.replaydata`` **一起使用**

    '''

class HeikinAshi(object):
    '''
    过滤器重塑开盘价、最高价、最低价、收盘价，使其成为HeikinAshi蜡烛图。
    HeikinAshi蜡烛图计算“开盘价、最高价、最低价、收盘价”的方法不同，采用了平均值的计算方法，
    这在某种程度上能够让图表忽略掉一些不必要的波动，让趋势变得更为明显。
    See:
      - https://en.wikipedia.org/wiki/Candlestick_chart#Heikin_Ashi_candlesticks
      - http://stockcharts.com/school/doku.php?id=chart_school:chart_analysis:heikin_ashi

    '''
